<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // function test(num) {
        //     console.log(num) 
        // }

        // setInterval(test(10),2000);
        // // 缺陷  定时器第一个参数是一个函数，函数不能携带参数

        // function test(num) {
        //     return function() {

        //         console.log(num)
        //     }
        // }
        // const fn = test(10);
        // setInterval(fn,2000);

        // // 闭包的应用场景
        // function fn1() {
        //     var num = 122333;
        //     return function() {
        //         return num
        //     }
        // }
        // const fn = fn1();
        // console.log(fn());


        // 应用场景 :
        // 定时器 第一个参数是函数 不能携带参数  
        // 全局想使用 局部作用域中的内容  

        // 优点 :
        //  1.因为函数执行空间不会被销毁 所以一直在内存中待着 
        //  可以重复的使用 
        //  2. 避免全局变量的污染 


        // 闭包的缺点 :
        // 常驻内存 内存消耗大 会造成内存泄漏 
        
        function outer(){
            let num1 = 100;
            let num2 = 200;
            const obj = {
                getNum1(){
                    return num1;
                },
                getNum2(){
                    return num2;
                },
                setNum1(num){
                    num1 = num;
                },
                setNum2(num){
                    num2 = num;
                }
            }
            return obj;
        }

        const o1 = outer();

        console.log(o1.getNum1());
        console.log(o1.getNum2());
        o1.setNum1(1000);
        o1.setNum2(2000);
        console.log(o1.getNum1());
        console.log(o1.getNum2());

        const o2 = outer();
        console.log(o2.getNum1());
        console.log(o2.getNum2());



    </script>
</body>
</html>